//+------------------------------------------------------------------+
//|                                                        Trend.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include "Indicator.h"

//+------------------------------------------------------------------+
//| ADX指标类 (Average Directional Index)                           |
//| 用途：实现"平均方向指数"指标                                     |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiADX : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期

public:
   /** 构造函数 */
   CiADX(void);
   
   /** 析构函数 */
   ~CiADX(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /**
    * 获取正方向线值
    * @param index 索引位置
    * @return 指标值
    */
   double            Plus(const int index) const;
   
   /**
    * 获取负方向线值
    * @param index 索引位置
    * @return 指标值
    */
   double            Minus(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
};

//+------------------------------------------------------------------+
//| Wilder ADX指标类 (Average Directional Index by Welles Wilder)   |
//| 用途：实现"威尔斯·怀尔德平均方向指数"指标                         |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiADXWilder : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期

public:
   /** 构造函数 */
   CiADXWilder(void);
   
   /** 析构函数 */
   ~CiADXWilder(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /**
    * 获取正方向线值
    * @param index 索引位置
    * @return 指标值
    */
   double            Plus(const int index) const;
   
   /**
    * 获取负方向线值
    * @param index 索引位置
    * @return 指标值
    */
   double            Minus(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
};

//+------------------------------------------------------------------+
//| 布林带指标类 (Bollinger Bands)                                  |
//| 用途：实现"布林带"指标                                           |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiBands : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_ma_shift;         // 移动平均偏移
   double            m_deviation;        // 标准差倍数
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiBands(void);
   
   /** 析构函数 */
   ~CiBands(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取移动平均偏移 */
   int               MaShift(void) const;
   
   /** 获取标准差倍数 */
   double            Deviation(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ma_shift 移动平均偏移
    * @param deviation 标准差倍数
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int ma_period, const int ma_shift,
                            const double deviation, const int applied);
   
   /**
    * 获取中线值
    * @param index 索引位置
    * @return 指标值
    */
   double            Base(const int index) const;
   
   /**
    * 获取上轨值
    * @param index 索引位置
    * @return 指标值
    */
   double            Upper(const int index) const;
   
   /**
    * 获取下轨值
    * @param index 索引位置
    * @return 指标值
    */
   double            Lower(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ma_shift 移动平均偏移
    * @param deviation 标准差倍数
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int ma_period, const int ma_shift,
                                const double deviation, const int applied);
};

//+------------------------------------------------------------------+
//| 包络线指标类 (Envelopes)                                        |
//| 用途：实现"包络线"指标                                           |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiEnvelopes : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_ma_shift;         // 移动平均偏移
   ENUM_MA_METHOD    m_ma_method;        // 移动平均方法
   int               m_applied;           // 应用价格类型
   double            m_deviation;        // 偏差百分比

public:
   /** 构造函数 */
   CiEnvelopes(void);
   
   /** 析构函数 */
   ~CiEnvelopes(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取移动平均偏移 */
   int               MaShift(void) const;
   
   /** 获取移动平均方法 */
   ENUM_MA_METHOD    MaMethod(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /** 获取偏差百分比 */
   double            Deviation(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ma_shift 移动平均偏移
    * @param ma_method 移动平均方法
    * @param applied 应用价格类型
    * @param deviation 偏差百分比
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int ma_period, const int ma_shift, const ENUM_MA_METHOD ma_method,
                            const int applied, const double deviation);
   
   /**
    * 获取上轨值
    * @param index 索引位置
    * @return 指标值
    */
   double            Upper(const int index) const;
   
   /**
    * 获取下轨值
    * @param index 索引位置
    * @return 指标值
    */
   double            Lower(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ma_shift 移动平均偏移
    * @param ma_method 移动平均方法
    * @param applied 应用价格类型
    * @param deviation 偏差百分比
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int ma_period, const int ma_shift, const ENUM_MA_METHOD ma_method,
                                const int applied, const double deviation);
};

//+------------------------------------------------------------------+
//| 一目均衡表指标类 (Ichimoku Kinko Hyo)                            |
//| 用途：实现"一目均衡表"指标                                       |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiIchimoku : public CIndicator
{
protected:
   int               m_tenkan_sen;       // 转换线周期
   int               m_kijun_sen;        // 基准线周期
   int               m_senkou_span_b;    // 后移线周期

public:
   /** 构造函数 */
   CiIchimoku(void);
   
   /** 析构函数 */
   ~CiIchimoku(void);
   
   /** 获取转换线周期 */
   int               TenkanSenPeriod(void) const;
   
   /** 获取基准线周期 */
   int               KijunSenPeriod(void) const;
   
   /** 获取后移线周期 */
   int               SenkouSpanBPeriod(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param tenkan_sen 转换线周期
    * @param kijun_sen 基准线周期
    * @param senkou_span_b 后移线周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int tenkan_sen, const int kijun_sen, const int senkou_span_b);
   
   /**
    * 获取转换线值
    * @param index 索引位置
    * @return 指标值
    */
   double            TenkanSen(const int index) const;
   
   /**
    * 获取基准线值
    * @param index 索引位置
    * @return 指标值
    */
   double            KijunSen(const int index) const;
   
   /**
    * 获取先行带A值
    * @param index 索引位置
    * @return 指标值
    */
   double            SenkouSpanA(const int index) const;
   
   /**
    * 获取先行带B值
    * @param index 索引位置
    * @return 指标值
    */
   double            SenkouSpanB(const int index) const;
   
   /**
    * 获取延迟线值
    * @param index 索引位置
    * @return 指标值
    */
   double            ChinkouSpan(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param tenkan_sen 转换线周期
    * @param kijun_sen 基准线周期
    * @param senkou_span_b 后移线周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int tenkan_sen, const int kijun_sen, const int senkou_span_b);
};

//+------------------------------------------------------------------+
//| 移动平均指标类 (Moving Average)                                 |
//| 用途：实现"移动平均"指标                                         |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiMA : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_ma_shift;         // 移动平均偏移
   ENUM_MA_METHOD    m_ma_method;        // 移动平均方法
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiMA(void);
   
   /** 析构函数 */
   ~CiMA(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取移动平均偏移 */
   int               MaShift(void) const;
   
   /** 获取移动平均方法 */
   ENUM_MA_METHOD    MaMethod(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ma_shift 移动平均偏移
    * @param ma_method 移动平均方法
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int ma_period, const int ma_shift,
                            const ENUM_MA_METHOD ma_method, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @极 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ma_shift 移动平均偏移
    * @param ma_method 移动平均方法
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int ma_period, const极 ma_shift,
                                const ENUM_MA_METHOD ma_method, const int applied);
};

//+------------------------------------------------------------------+
//| 抛物线转向指标类 (Parabolic Stop And Reverse System)             |
//| 用途：实现"抛物线转向"指标                                       |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiSAR : public CIndicator
{
protected:
   double            m_step;             // 步长
   double            m_maximum;          // 最大值

public:
   /** 构造函数 */
   CiSAR(void);
   
   /** 析构函数 */
   ~CiSAR(void);
   
   /** 获取步长 */
   double            SarStep(void) const;
   
   /** 获取最大值 */
   double            Maximum(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param step 步长
    * @param maximum 最大值
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const double step, const double maximum);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param step 步长
    * @param maximum 最大值
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const double step, const double maximum);
};

//+------------------------------------------------------------------+
//| 标准差指标类 (Standard Deviation)                               |
//| 用途：实现"标准差"指标                                           |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiStdDev : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_ma_shift;         // 移动平均偏移
   ENUM_MA_METHOD    m_极_method;        // 移动平均方法
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiStdDev(void);
   
   /** 析构函数 */
   ~CiStdDev(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取移动平均偏移 */
   int               MaShift(void) const;
   
   /** 获取移动平均方法 */
   ENUM_MA_METHOD    MaMethod(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ma_shift 移动平均偏移
    * @param ma_method 移动平均方法
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int ma_period, const int ma_shift,
                            const ENUM_MA_METHOD ma_method, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ma_shift 移动平均偏移
    * @param ma_method 移动平均方法
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int ma_period, const int ma_shift,
                                const ENUM_MA_METHOD ma_method, const int applied);
};

//+------------------------------------------------------------------+
//| 双指数移动平均指标类 (Double Exponential Moving Average)        |
//| 用途：实现"双指数移动平均"指标                                   |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiDEMA : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_ind_shift;        // 指标偏移
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiDEMA(void);
   
   /** 析构函数 */
   ~CiDEMA(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取指标偏移 */
   int               IndShift(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ind_shift 指标偏移
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int ma_period, const int ind_shift, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标极
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ind_shift 指标偏移
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int ma_period, const int ind_shift, const int applied);
};

//+------------------------------------------------------------------+
//| 三重指数移动平均指标类 (Triple Exponential Moving Average)      |
//| 用途：实现"三重指数移动平均"指标                                 |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiTEMA : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_ind_shift;        // 指标偏移
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiTEMA(void);
   
   /** 析构函数 */
   ~CiTEMA(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取指标偏移 */
   int               IndShift(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ind_shift 指标偏移
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int ma_period, const int ind_shift, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ind_shift 指标偏移
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int ma_period, const int ind_shift, const int applied);
};

//+------------------------------------------------------------------+
//| 分形自适应移动平均指标类 (Fractal Adaptive Moving Average)       |
//| 用途：实现"分形自适应移动平均"指标                               |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiFrAMA : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_ind_shift;        // 指标偏移
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiFrAMA(void);
   
   /** 析构函数 */
   ~CiFrAMA(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取指标偏移 */
   int               IndShift(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ind_shift 指标偏移
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int ma_period, const int ind_shift, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ind_shift 指标偏移
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int ma_period, const int ind_shift, const int applied);
};

//+------------------------------------------------------------------+
//| 自适应移动平均指标类 (Adaptive Moving Average)                  |
//| 用途：实现"自适应移动平均"指标                                   |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiAMA : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_fast_ema_period;  // 快速EMA周期
   int               m_slow_ema_period;  // 慢速EMA周期
   int               m_ind_shift;        // 指标偏移
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiAMA(void);
   
   /** 析构函数 */
   ~CiAMA(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取快速EMA周期 */
   int               FastEmaPeriod(void) const;
   
   /** 获取慢速EMA周期 */
   int               SlowEmaPeriod(void) const;
   
   /** 获取指标偏移 */
   int               IndShift(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param fast_ema_period 快速EMA周期
    * @param slow_ema_period 慢速EMA周期
    * @param ind_shift 指标偏移
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int ma_period, const int fast_ema_period, const int slow_ema_period,
                            const int ind_shift, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param fast_ema_period 快速EMA周期
    * @param slow_ema_period 慢速EMA周期
    * @param ind_shift 指标偏移
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int ma_period, const int fast_ema_period, const int slow_ema_period,
                                const int ind_shift, const int applied);
};

//+------------------------------------------------------------------+
//| 动态变动指数平均指标类 (Variable Index Dynamic Average)         |
//| 用途：实现"动态变动指数平均"指标                                 |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiVIDyA : public CIndicator
{
protected:
   int               m_cmo_period;       // CMO周期
   int               m_ema_period;       // EMA周期
   int               m_ind_shift;        // 指标偏移
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiVIDyA(void);
   
   /** 析构函数 */
   ~CiVIDyA(void);
   
   /** 获取CMO周期 */
   int               CmoPeriod(void) const;
   
   /** 获取EMA周期 */
   int               EmaPeriod(void) const;
   
   /** 获取指标偏移 */
   int               IndShift(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param cmo_period CMO周期
    * @param ema_period EMA周期
    * @param ind_shift 指标偏移
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int cmo_period, const int ema_period,
                            const int ind_shift, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param cmo_period CMO周期
    * @param ema_period EMA周期
    * @param ind_shift 指标偏移
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int cmo_period, const int ema_period,
                                const int ind_shift, const int applied);
};
//+------------------------------------------------------------------+